Data

First, we will read in the MISR datasets which have been matched to the AQS and CSN datasets. These data were matched spatially by considering every AQS/CSN data collection site within a 2.2 km radius of a MISR data pixel, and these matches were further filtered by matching these observations based on the dates when they were recorded.

We will also slightly alter these datasets, by changing the way that dates are stored in the data. Instead of storing dates as one object in a YYYY-MM-DD format, we will instead store the day, month, and year as three separate attributes.

In addition to the data which we collected from the CSN dataset, we will also use a formula to estimate the total dust mass in a given area, based on the presence of certain elements.

The formula for computing dust mass is given by \(\text{Dust Mass} = 2.2\times\text{Al} + 2.49\times\text{Si} + 1.63\times\text{Ca} + 1.94\times\text{Ti} + 2.42\times\text{Fe}\).

Exploratory Data Analysis

First, we will do some exploratory data analysis for these datasets, so we can have a better understanding of the data which we collected.

Numerical Summaries

We will examine some brief numerical summaries of our main four variables, in order to know more about their general distributions.

Numerical Summaries of the variables we want to predict
Minimum 25th percentile Median 75th percentile Maximum IQR Range Mean Standard Deviation Present Values Missing Values
Dust Mass -0.0284 0.3503 0.6126 1.0773 18.3301 0.7270 18.3584 0.9065 1.0361 5115 174
Nitrate 0.0000 0.6300 1.4000 3.4400 53.9000 2.8100 53.9000 3.0576 4.6030 5073 216
Sulfate 0.0000 0.5640 0.9943 1.6800 10.7000 1.1160 10.7000 1.3069 1.1535 5094 195
PM2.5 -7.2000 5.0000 8.0833 12.4583 529.4167 7.4583 536.6167 10.4596 10.6680 157005 0

Based on the table above, we see that there are a few negative values recorded for Dust Mass and PM2.5 concentrations. As a concentration must be strictly non-negative (as we cannot have negative amounts of a particle), we will replace all negative values with 0.

Histograms

In addition to examining numerical summaries of these values, we will also examine histograms of the values to see the overall distributions of these variables in a more visual manner.

From the plots above, we see that the distributions for each of these four variables are all somewhat right-skewed, as there are quite a few high-valued outliers in these datasets, and there are not a corresponding amount of low values in these data, as these data are all strictly non-negative.

The log-plots above all appear to be relatively symmetrical and look somewhat like Normal distributions, which may be helpful for model fitting and prediction purposes, as these distributions are significantly less skewed by their few large values.

Historical Data

In addition to the histograms which show the general distributions of these data over our 22-year period, we have created time series plots of dust mass, nitrate, PM2.5, and sulfate concentrations in California over time as a way to visualize how these quantities have changed over time.

The PM2.5 data is sourced from the AQS data collection sites, whereas the dust mass, nitrate, and sulfate concentrations come from the CSN datasets.

Monthly Dust Mass Concentrations in California Monthly Nitrate Concentrations in California

Monthly PM2.5 Concentrations in California

Monthly Dust Mass Concentrations in California

Finding Missing Values

To start off, we will examine counts of missing values in our datasets, to determine how much of the data which we aim to use is actually present in the dataset.

Missing Values in the AQS dataset

Counts of Variables in the merged MISR and AQS dataset
Variable Name Recorded Values Missing Values
PM25 157005 0
Year 157005 0
Month 157005 0
Day 157005 0
Site.Latitude 157005 0
Site.Longitude 157005 0
elevation 157005 0
pixel.latitude 157005 0
pixel.longitude 157005 0
AOD 50089 106916
AOD_uncertainty 50089 106916
angstrom_exp_550_860 50089 106916
AOD_absorption 50089 106916
AOD_nonspherical 50089 106916
small_mode_AOD 50089 106916
medium_mode_AOD 50089 106916
large_mode_AOD 50089 106916
aod_mix_01 57964 99041
aod_mix_02 58151 98854
aod_mix_03 58387 98618
aod_mix_04 58675 98330
aod_mix_05 58870 98135
aod_mix_06 59079 97926
aod_mix_07 59220 97785
aod_mix_08 59105 97900
aod_mix_09 58027 98978
aod_mix_10 54411 102594
aod_mix_11 63009 93996
aod_mix_12 62969 94036
aod_mix_13 62990 94015
aod_mix_14 62899 94106
aod_mix_15 62332 94673
aod_mix_16 61316 95689
aod_mix_17 59339 97666
aod_mix_18 56133 100872
aod_mix_19 51824 105181
aod_mix_20 46472 110533
aod_mix_21 49385 107620
aod_mix_22 49028 107977
aod_mix_23 48577 108428
aod_mix_24 47605 109400
aod_mix_25 46377 110628
aod_mix_26 45070 111935
aod_mix_27 43693 113312
aod_mix_28 42072 114933
aod_mix_29 40508 116497
aod_mix_30 38868 118137
aod_mix_31 61811 95194
aod_mix_32 61716 95289
aod_mix_33 61529 95476
aod_mix_34 60895 96110
aod_mix_35 60081 96924
aod_mix_36 58316 98689
aod_mix_37 55627 101378
aod_mix_38 52266 104739
aod_mix_39 48168 108837
aod_mix_40 43772 113233
aod_mix_41 53302 103703
aod_mix_42 53203 103802
aod_mix_43 53113 103892
aod_mix_44 52600 104405
aod_mix_45 51719 105286
aod_mix_46 50327 106678
aod_mix_47 48476 108529
aod_mix_48 46027 110978
aod_mix_49 43313 113692
aod_mix_50 40558 116447
aod_mix_51 60791 96214
aod_mix_52 54792 102213
aod_mix_53 38906 118099
aod_mix_54 51407 105598
aod_mix_55 43584 113421
aod_mix_56 33043 123962
aod_mix_57 38243 118762
aod_mix_58 33797 123208
aod_mix_59 29758 127247
aod_mix_60 29972 127033
aod_mix_61 29164 127841
aod_mix_62 28486 128519
aod_mix_63 38842 118163
aod_mix_64 37758 119247
aod_mix_65 36746 120259
aod_mix_66 35872 121133
aod_mix_67 29471 127534
aod_mix_68 28945 128060
aod_mix_69 28730 128275
aod_mix_70 28666 128339
aod_mix_71 28061 128944
aod_mix_72 28061 128944
aod_mix_73 28068 128937
aod_mix_74 28088 128917

First, we notice that there are no missing values for PM2.5, the date-related variables, or the spatial variables. This is excellent, as these values are the most important predictors for the models which we will fit.

We can also notice that there are the same amount of recorded and missing values for each of the 8 AOD variables. If we examine these 8 variables further, we find that they are a “package deal”; for each observation, there is either a recorded value for all 8 of these variables, or a missing value for all 8 variables.

Unfortunately, the same cannot be said for the 74 AOD mixture variables. From the table above, we can clearly see that the number of available observations varies for each of the 74 mixtures. However, of these 74 mixtures, the mixtures with the fewest number of recorded observations (aod_mix_71 and aod_mix_72) each have 36746 recorded values. Furthermore, a table containing all 74 mixtures would have 20604 observations which have a recorded value for each of the 74 mixtures, which is a fair amount of data to work with.

Charts and Graphs

Next, we will create some charts and plots of the matched MISR data, to get visual representations of the data which we have collected.

First, we will create a “correlation heatmap” to visually depict the correlations between the 74 AOD mixtures which were collected in the MISR data. In the correlation heatmap shown below, the correlations between these different mixtures are measured from -1 to 1, and each square in the heatmap is coloured in, with it’s colour and intensity proportional to the correlation between the variables.

Correlation Heatmap for the 74 MISR Mixtures

As we can clearly see in the correlation heatmap displayed above, the 74 AOD mixtures in the collected MISR data are all strongly correlated with one another, as the entire heatmap is green.

In fact, the weakest correlation between a pair of these 74 AOD mixtures is 0.681, which is the correlation between aod_mix_01 and aod_mix_44, which is still considered to be a strong positive linear relationship between two variables.

Model Fitting

Next, we will test a variety of different model fitting techniques on our dataset in order to determine which models are generally more efficient and serve as better models to make predictions for our dataset.

We will create a whole host of different models, as we have multiple different values in these two datasets which we want to predict, and there are multiple different sets of predictors which we aim to incorporate.

The 6 main values which we want to predict are; PM2.5, \(\text{SO}_{4}^{2-}\) (sulfate), \(\text{NO}_{3}^{-}\) (nitrate), dust mass, elemental carbon, and organic carbon. The two primary sets of predictors which we want to use are the 8 measured AOD values, and the 74 MISR AOD mixtures.

In addition to these two sets of predictors mentioned above, we will also introduce a “Months” variable to help account for the changes in these values over time. The Months variable will be computed by determining how many months it has been since March 2000, as March 2000 is the starting point for the data which we have collected.

To fit our models, we will first remove any observations which have unrecorded values for the desired predictors. Then, we will split the data into a training dataset, a validation dataset, and a test dataset using a 70/15/15 ratio.

PM2.5 AOD XGBoost

Using the xgboost package, we will fit an an XGBooster model (eXtreme Gradient Booster) which predicts PM2.5 concentrations based on the 8 AOD parameters.

To fit this model, we will tune the hyperparameters of the XGBooster (using the caret package) by fitting XGB models with different combinations of our potential hyperparameters on the validation dataset, and we will select the hyperparameters corresponding to the model(s) which had the highest R-squared and the lowest RMSE on the validation dataset as candidate models to use on the test set.

Model Performance of XGBoost models on the validation dataset
Model: Predicting PM2.5 Concentration using AOD Parameters
nrounds eta max_depth gamma colsample_bytree min_child_weight subsample RMSE R2
100 0.1 10 0.01 0.50 0 0.50 5.202482 0.6637990
100 0.3 10 0.01 0.50 0 0.50 5.282079 0.6507611
100 0.6 10 0.01 0.50 0 0.50 5.747228 0.6120705
100 1.0 10 0.01 0.50 0 0.50 7.891037 0.4415577
100 0.1 10 0.01 0.75 0 0.50 5.163244 0.6685864
100 0.3 10 0.01 0.75 0 0.50 5.128387 0.6708393
100 0.6 10 0.01 0.75 0 0.50 5.626539 0.6219220
100 1.0 10 0.01 0.75 0 0.50 8.041232 0.4341323
100 0.1 10 0.01 1.00 0 0.50 5.263963 0.6530415
100 0.3 10 0.01 1.00 0 0.50 5.040838 0.6828201
100 0.6 10 0.01 1.00 0 0.50 5.946401 0.5908290
100 1.0 10 0.01 1.00 0 0.50 7.432021 0.4898398
100 0.1 10 0.01 0.50 1 0.50 5.127203 0.6735977
100 0.3 10 0.01 0.50 1 0.50 5.129245 0.6698760
100 0.6 10 0.01 0.50 1 0.50 5.688097 0.6184665
100 1.0 10 0.01 0.50 1 0.50 7.644433 0.4647416
100 0.1 10 0.01 0.75 1 0.50 5.224266 0.6595215
100 0.3 10 0.01 0.75 1 0.50 5.044513 0.6814451
100 0.6 10 0.01 0.75 1 0.50 5.673159 0.6192293
100 1.0 10 0.01 0.75 1 0.50 7.600873 0.4692419
100 0.1 10 0.01 1.00 1 0.50 5.156479 0.6681520
100 0.3 10 0.01 1.00 1 0.50 5.184213 0.6647260
100 0.6 10 0.01 1.00 1 0.50 5.663258 0.6226685
100 1.0 10 0.01 1.00 1 0.50 7.455947 0.4722111
100 0.1 10 0.01 0.50 0 0.75 5.056762 0.6825538
100 0.3 10 0.01 0.50 0 0.75 4.890586 0.6998622
100 0.6 10 0.01 0.50 0 0.75 5.330233 0.6508163
100 1.0 10 0.01 0.50 0 0.75 6.015911 0.5914966
100 0.1 10 0.01 0.75 0 0.75 5.022448 0.6860145
100 0.3 10 0.01 0.75 0 0.75 4.889474 0.6999861
100 0.6 10 0.01 0.75 0 0.75 5.267962 0.6605827
100 1.0 10 0.01 0.75 0 0.75 6.276840 0.5601121
100 0.1 10 0.01 1.00 0 0.75 5.088522 0.6765240
100 0.3 10 0.01 1.00 0 0.75 4.957611 0.6918852
100 0.6 10 0.01 1.00 0 0.75 5.231514 0.6656534
100 1.0 10 0.01 1.00 0 0.75 6.168914 0.5705885
100 0.1 10 0.01 0.50 1 0.75 5.093662 0.6775734
100 0.3 10 0.01 0.50 1 0.75 4.947187 0.6928258
100 0.6 10 0.01 0.50 1 0.75 5.313048 0.6559251
100 1.0 10 0.01 0.50 1 0.75 6.204362 0.5694506
100 0.1 10 0.01 0.75 1 0.75 5.053880 0.6823820
100 0.3 10 0.01 0.75 1 0.75 4.973792 0.6896890
100 0.6 10 0.01 0.75 1 0.75 5.346780 0.6496894
100 1.0 10 0.01 0.75 1 0.75 6.007290 0.5915002
100 0.1 10 0.01 1.00 1 0.75 5.032852 0.6838350
100 0.3 10 0.01 1.00 1 0.75 4.950514 0.6930501
100 0.6 10 0.01 1.00 1 0.75 5.331966 0.6524700
100 1.0 10 0.01 1.00 1 0.75 6.213494 0.5727659
100 0.1 10 0.01 0.50 0 1.00 5.074047 0.6796810
100 0.3 10 0.01 0.50 0 1.00 4.914081 0.6968621
100 0.6 10 0.01 0.50 0 1.00 4.995170 0.6893325
100 1.0 10 0.01 0.50 0 1.00 5.661705 0.6277598
100 0.1 10 0.01 0.75 0 1.00 5.051063 0.6816335
100 0.3 10 0.01 0.75 0 1.00 4.791519 0.7118008
100 0.6 10 0.01 0.75 0 1.00 5.154544 0.6751718
100 1.0 10 0.01 0.75 0 1.00 5.703997 0.6238608
100 0.1 10 0.01 1.00 0 1.00 5.011746 0.6858280
100 0.3 10 0.01 1.00 0 1.00 4.874025 0.7019952
100 0.6 10 0.01 1.00 0 1.00 4.991401 0.6927333
100 1.0 10 0.01 1.00 0 1.00 5.570456 0.6376836
100 0.1 10 0.01 0.50 1 1.00 5.078687 0.6798578
100 0.3 10 0.01 0.50 1 1.00 4.894080 0.6993305
100 0.6 10 0.01 0.50 1 1.00 5.125162 0.6755629
100 1.0 10 0.01 0.50 1 1.00 6.166635 0.5783739
100 0.1 10 0.01 0.75 1 1.00 5.017638 0.6860320
100 0.3 10 0.01 0.75 1 1.00 4.847723 0.7050131
100 0.6 10 0.01 0.75 1 1.00 5.119019 0.6768976
100 1.0 10 0.01 0.75 1 1.00 5.831223 0.6088921
100 0.1 10 0.01 1.00 1 1.00 5.011746 0.6858280
100 0.3 10 0.01 1.00 1 1.00 4.874025 0.7019952
100 0.6 10 0.01 1.00 1 1.00 4.991401 0.6927333
100 1.0 10 0.01 1.00 1 1.00 5.570456 0.6376836
Best-Performing Model(s) on the validation dataset
nrounds eta max_depth gamma colsample_bytree min_child_weight subsample RMSE R2
100 0.3 10 0.01 0.75 0 1 4.791519 0.7118008